package mainBlock

import (
	"gitee.com/wchpub/dwSvrPub/dwProto"
	"gitee.com/wchpub/fnsvr/funcSless"
)

type BlockType string

const (
	//数据块名称
	BlockName string = "main"
)

const (
	//档案版本号
	Key_Ver BlockType = funcSless.GAME_DATA_VERSION_KEY

	//最近一次从抖小侧边栏跳回的时间
	//Key_DyMiniSideBarBackTime BlockType = "dyMiniSideBarBackTime"

	//最近一次领取抖小侧边栏奖励的时间
	Key_DyMiniSideBarRewardTime BlockType = "dyMiniSideBarRewardTime"

	//抖小桌面快捷方式领奖时间
	Key_DyMiniDesktopRewardTime BlockType = "dyMiniDesktopRewardTime"

	Key_TotalPassCount BlockType = "totalPassCount" //总通关次数 v2已废弃
	Key_TotalGameTimes BlockType = "totalGameTimes" //总游戏次数

	Key_NormalTotalPassCount BlockType = "normalTotalPassCount" //萌新总通关次数
	Key_MasterTotalPassCount BlockType = "masterTotalPassCount" //大师总通关次数

	Key_AdSeed   BlockType = "adSeed"   //广告种子，用于校验合法性
	Key_JoinTime BlockType = "joinTime" //用户加入时间

	Key_RankingTeam         BlockType = "rankingTeam"         //排行分组，空白表示其它
	Key_RankingTeamSetTimes BlockType = "rankingTeamSetTimes" //排行分组设置次数

	//头像信息
	Key_Face     BlockType = "face"     //用户头像
	Key_Nickname BlockType = "nickName" //用户昵称

	//当前选中的头像
	Key_ChooseSkinId  BlockType = "chooseSkinId"
	Key_ChooseSkinIdx BlockType = "chooseSkinIdx"

	//主题
	Key_ChooseNormalTheme   BlockType = "chooseNormalTheme"   //萌新当前主题
	Key_ChooseMasterTheme   BlockType = "chooseMasterTheme"   //大师当前主题
	Key_AdChooseNormalTheme BlockType = "adChooseNormalTheme" //广告解锁的当前主题

	Key_DailyPassCount BlockType = "dailyPassCount" //每日通关次数,字典形式存储，key为utc秒时间戳，value为通关次数

	Key_Guide BlockType = "guide" //指引的事件号

	////////////////////////////////////////////////////////////
	//json类型
	Key_JoinRankCtx BlockType = "joinRankCtx" //加入排行榜的上下文数据，可加入排行榜时存在
	Key_Items       BlockType = "items"       //所有道具
	Key_Skins       BlockType = "skins"       //皮肤数据
	Key_Themes      BlockType = "themes"      //主题数据
	//Key_CollectedSkin    BlockType = "collectedSkin"    //已收藏的皮肤
	Key_DailyLevelReward BlockType = "dailyLevelReward" //每日关卡奖励,如果值有效则表示有未领取的奖励
)

type ThemesType map[int32]*dwProto.ThemeInfo

// 道具信息
type ItemInfo struct {
	Num            int64 `json:"num"`                      //道具数量 或 惰性运算参数的当前值
	LastChangeTime int64 `json:"lastChangeTime,omitempty"` //惰性运算参数最近一次增加或减少值的时间,单位毫秒
}

// 玩家拥有的全部道具
type ItemsType map[int32]*ItemInfo

// 每日通关数据
type DailyPassInfo struct {
	Times int32 `json:"times"` //通关次数
}
type DailyPassType map[int64]*DailyPassInfo

type Data struct {
	super *funcSless.Block[BlockType]
}

// 玩家所有道具数据
func (m *Data) Items() (ItemsType, error) {
	re := make(ItemsType)
	err := m.super.GetJson(Key_Items, &re)
	if err != nil {
		return nil, err
	}

	return re, nil
}

func (m *Data) SetItems(itemsValue ItemsType) error {
	return m.super.SetJson(Key_Items, itemsValue)
}

// 玩家所有主题数据
func (m *Data) Themes() (ThemesType, error) {
	re := make(ThemesType)
	err := m.super.GetJson(Key_Themes, &re)
	if err != nil {
		return nil, err
	}

	return re, nil
}

func (m *Data) SetThemes(v ThemesType) error {
	return m.super.SetJson(Key_Themes, v)
}

// 加入排行榜的上下文数据，可加入排行榜时存在
func (m *Data) SetJoinRankCtx(v *dwProto.JoinRankCtx) error {
	return m.super.SetJson(Key_JoinRankCtx, v)
}

func (m *Data) JoinRankCtx() (*dwProto.JoinRankCtx, error) {
	re := dwProto.JoinRankCtx{}
	err := m.super.GetJson(Key_JoinRankCtx, &re)
	if err != nil {
		return nil, err
	}

	return &re, nil
}

// 每日通关次数
func (m *Data) DailyPassCount() (DailyPassType, error) {
	re := make(DailyPassType)
	err := m.super.GetJson(Key_DailyPassCount, &re)
	if err != nil {
		return nil, err
	}

	return re, nil
}

func (m *Data) SetDailyPassCount(itemsValue DailyPassType) error {
	return m.super.SetJson(Key_DailyPassCount, itemsValue)
}

// 皮肤
func (m *Data) SetSkins(v []*dwProto.SkinInfo) error {
	return m.super.SetJson(Key_Skins, v)
}

func (m *Data) Skins() ([]*dwProto.SkinInfo, error) {
	re := []*dwProto.SkinInfo{}
	err := m.super.GetJson(Key_Skins, &re)
	if err != nil {
		return nil, err
	}

	return re, nil
}

// 指引的事件号
func (m *Data) Guide() ([]int64, error) {
	re := []int64{}
	err := m.super.GetJson(Key_Guide, &re)
	if err != nil {
		return nil, err
	}

	return re, nil

}

func (m *Data) SetGuide(v []int64) error {
	return m.super.SetJson(Key_Guide, v)
}

// 日常关奖励信息
func (m *Data) SetDailyLevelReward(v *dwProto.DailyLevelReward) error {
	return m.super.SetJson(Key_DailyLevelReward, v)
}

func (m *Data) DailyLevelReward() (*dwProto.DailyLevelReward, error) {
	re := dwProto.DailyLevelReward{}
	err := m.super.GetJson(Key_DailyLevelReward, &re)
	if err != nil {
		return nil, err
	}

	return &re, nil
}

/*
// 最近一次从抖小侧边栏跳回的时间
func (m *Data) DyMiniSideBarBackTime() (int64, error) {
	return m.super.GetInt64(Key_DyMiniSideBarBackTime)
}

func (m *Data) SetDyMiniSideBarBackTime(v int64) {
	m.super.SetInt64(Key_DyMiniSideBarBackTime, v)
}
*/

// 最近一次领取抖小侧边栏奖励的时间
func (m *Data) DyMiniSideBarRewardTime() (int64, error) {
	return m.super.GetInt64(Key_DyMiniSideBarRewardTime)
}

func (m *Data) SetDyMiniSideBarRewardTime(v int64) {
	m.super.SetInt64(Key_DyMiniSideBarRewardTime, v)
}

// 最近一次领取抖小桌面奖励的时间
func (m *Data) DyMiniDesktopRewardTime() (int64, error) {
	return m.super.GetInt64(Key_DyMiniDesktopRewardTime)
}

func (m *Data) SetDyMiniDesktopRewardTime(v int64) {
	m.super.SetInt64(Key_DyMiniDesktopRewardTime, v)
}

// 总通关次数
func (m *Data) TotalPassCount() (int64, error) {
	return m.super.GetInt64(Key_TotalPassCount)
}

func (m *Data) SetTotalPassCount(v int64) {
	m.super.SetInt64(Key_TotalPassCount, v)
}

// 萌新总通关次数
func (m *Data) NormalTotalPassCount() (int64, error) {
	return m.super.GetInt64(Key_NormalTotalPassCount)
}

func (m *Data) SetNormalTotalPassCount(v int64) {
	m.super.SetInt64(Key_NormalTotalPassCount, v)
}

// 大师总通关次数
func (m *Data) MasterTotalPassCount() (int64, error) {
	return m.super.GetInt64(Key_MasterTotalPassCount)
}

func (m *Data) SetMasterTotalPassCount(v int64) {
	m.super.SetInt64(Key_MasterTotalPassCount, v)
}

// 排行所属队伍
func (m *Data) RankingTeam() (string, error) {
	return m.super.GetString(Key_RankingTeam)
}

func (m *Data) SetRankingTeam(v string) {
	m.super.SetString(Key_RankingTeam, v)
}

// 用户头像
func (m *Data) Face() (bool, error) {
	return m.super.GetBool(Key_Face)
}

func (m *Data) SetFace(v bool) {
	m.super.SetBool(Key_Face, v)
}

// 用户昵称
func (m *Data) Nickname() (string, error) {
	return m.super.GetString(Key_Nickname)
}

func (m *Data) SetNickname(v string) {
	m.super.SetString(Key_Nickname, v)
}

// 排行所属队伍设置次数
func (m *Data) RankingTeamSetTimes() (int64, error) {
	return m.super.GetInt64(Key_RankingTeamSetTimes)
}

func (m *Data) SetRankingTeamSetTimes(v int64) {
	m.super.SetInt64(Key_RankingTeamSetTimes, v)
}

// 总游戏次数
func (m *Data) TotalGameTimes() (int64, error) {
	return m.super.GetInt64(Key_TotalGameTimes)
}

func (m *Data) SetTotalGameTimes(v int64) {
	m.super.SetInt64(Key_TotalGameTimes, v)
}

// 广告验证种子
func (m *Data) AdSeed() (int, error) {
	return m.super.GetInt(Key_AdSeed)
}

func (m *Data) SetAdSeed(v int) {
	m.super.SetInt(Key_AdSeed, v)
}

/*
// 大师币
func (m *Data) MasterCoin() (int64, error) {
	return m.super.GetInt64(Key_MasterCoin)
}

func (m *Data) SetMasterCoin(v int64) {
	m.super.SetInt64(Key_MasterCoin, v)
}

// 萌新币
func (m *Data) NormalCoin() (int64, error) {
	return m.super.GetInt64(Key_NormalCoin)
}

func (m *Data) SetNormalCoin(v int64) {
	m.super.SetInt64(Key_NormalCoin, v)
}
*/
// 当前选中的皮肤
func (m *Data) ChooseSkinId() (int, error) {
	return m.super.GetInt(Key_ChooseSkinId)
}

func (m *Data) SetChooseSkinId(v int) {
	m.super.SetInt(Key_ChooseSkinId, v)
}

func (m *Data) ChooseSkinIdx() (int, error) {
	return m.super.GetInt(Key_ChooseSkinIdx)
}

func (m *Data) SetChooseSkinIdx(v int) {
	m.super.SetInt(Key_ChooseSkinIdx, v)
}

// 萌新当前主题
func (m *Data) ChooseNormalTheme() (int, error) {
	return m.super.GetInt(Key_ChooseNormalTheme)
}

func (m *Data) SetChooseNormalTheme(v int) {
	m.super.SetInt(Key_ChooseNormalTheme, v)
}

// 广告解锁的萌新当前主题
func (m *Data) AdChooseNormalTheme() (int, error) {
	return m.super.GetInt(Key_AdChooseNormalTheme)
}

func (m *Data) SetAdChooseNormalTheme(v int) {
	m.super.SetInt(Key_AdChooseNormalTheme, v)
}

// 大师当前主题
func (m *Data) ChooseMasterTheme() (int, error) {
	return m.super.GetInt(Key_ChooseMasterTheme)
}

func (m *Data) SetChooseMasterTheme(v int) {
	m.super.SetInt(Key_ChooseMasterTheme, v)
}

// 版本号
func (m *Data) Ver() (int64, error) {
	return m.super.GetInt64(Key_Ver)
}

func (m *Data) SetVer(v int64) {
	m.super.SetInt64(Key_Ver, v)
}

// 用户加入时间
func (m *Data) JoinTime() (int64, error) {
	return m.super.GetInt64(Key_JoinTime)
}

func (m *Data) SetJoinTime(v int64) {
	m.super.SetInt64(Key_JoinTime, v)
}

func (m *Data) PreLoad(keys ...BlockType) {
	m.super.PreLoad(keys...)
}

func (m *Data) GetAll() (map[string]string, error) {
	return m.super.GetAll()
}

func (m *Data) GetString(key string) (string, error) {
	return m.super.GetString(BlockType(key))
}

func (m *Data) BlockName() string {
	return BlockName
}

// 获取主数据块
func GetBlock(plyData *funcSless.PlayerData) (*Data, error) {

	bk, err := funcSless.GetBlock[BlockType](plyData, BlockName)
	if err != nil {
		return nil, err
	}

	return &Data{
		super: bk,
	}, nil
}
